#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	//1.打开RCC内部时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	/*外设GPIO配置*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//2.选择时基单元的时钟源，对于定时中断：
	//TIM_InternalClockConfig(TIM2);//选择内部时钟源
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x09);//选择外部时钟源，不分频,不反向（高电平/上升沿有效），用滤波器
	
	//3.配置时基单元，包括这里的预分频器、自动重装器、计数模式等等（用结构体配置）
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数（计数有向上、向下、中央对齐计数）
	
	/*定时时间决定于以下俩个对象*/
	/*这里预分频是对72M进行7200分频，得到10K计数频率，在10K的频率下，计10000个数，就是1s的时间*/
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;//周期，ARR自动重装器的值（从0计数到9）
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC预分频器的值；(预分频给1=不需要分频)
	
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值，高级定时器才有，TIM2为通用定时器，故置零
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动把更新中断标志位清除一下，就能避免列初始化完就进中断的问题了
	
	//4.配置输出中断控制，允许更新中断输出到NVIC
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
	//5.配置NVIC，在NVIC中打开定时器中断的通道，并分配一个优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);
	//6.运行控制，整个模块配置完成后，我们还需要使能一下计数器，要不然计数器是不会运行的
	//当定时器使能后，计数器就会开始计数了，当计数器更新时，触发中断
	TIM_Cmd(TIM2,ENABLE);
}

uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);
}

/*
void TIM2_IRQHandler(void)//中断函数
{
	//检查中断标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
	{
		
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}
*/
